package day0610

/**
  * @program: hadoop
  * @description: 模式匹配
  * @author: Qiang.Ye
  * @date: 2019-06-11 07:13
  **/
object Demo01 {

  def main(args: Array[String]): Unit = {
    //1.模式匹配：相当于switch case
   var chi = '-';
   var sign = 0;//标识符，如果chi为‘-’则将sign赋值为-1
    chi match {
      case  '+' =>  sign = 1
      case  '-' => sign = -1
      case _ => sign = 0
    }
    println(sign)


    //2.scala的守卫：匹配类中的所有值 case_if
    var ch2 = '6'
    var digit : Int = -1
    ch2 match {
      case '+' => println("是加号")
      case '-' => println("是减号")
      case _ if Character.isDigit(ch2) => digit = Character.digit(ch2,10)
      case _ => println("其他")
    }
    println(digit)
    //3.模式匹配中使用变量
    var myStr = "HelloWorld";

    myStr(7) match {
      case '+' => println("是加号")
      case '-' => println("是减号")
      case ch => println(ch)  //case语句中使用变量，ch代表传递过来的字符
    }

    /**
      * 4.匹配类型，相当于java中的instanceof，用法： case x:Int =>
      *
      * Any   表示任意类型，相当于java中的Object
      *
      * Unit  表示无值，相当于java中的void
      *
      * Nothing 在Scala中表示类底层的最低端，它是任何其他类型的子类型
      *
      * Null   是所有应用类型的子类，值为null
      *
      * 特殊的类型：
      * Option：Scala Option （选项）类型用来表示一个值是可选的（有值或者无值）
      * Some：如果值存在，Option就是Some
      * None：如果值不存在，Option就是Null
      * Nil：是一个空的List
      *
      *总结四个N：None，Nothing，Null，Nil
      * None：如果map中的值不存在，Option就是None
      * Nothing：如果方法抛出异常，返回值为Nothing，Nothing是任何其他类型的子类型
      * Null：可以赋值给其他引用类型，不能赋值给值类型
      * Nil：空的List
      *
      */
    var v4 : Any = 100
    v4 match {
      case x : Int => println("这是一个整数")
      case s : String => println("这是一个字符串")
      case _ => println("其他类型")
    }

   var myMap = Map("Andy"-> 90)
  println(myMap.get("Andy"))
  println(myMap.get("adfadf"))

    /**
      * 5.匹配数组和列表
      */
    var myArray = Array(1,2,3,5,8,9)
    myArray match {
      case Array(0) => println("数组中只有一个0")
      case Array(x,y) => println("数组中只有2个元素")
      case Array(x,y,z) => println("数组中只有3个元素")
      case Array(x,_*) => println("这是一个数组，包含多个元素")
    }

    var myList = List(1,2,3,9,3,2)
    myList match {
      case List(0) => println("列表中只有一个0")
      case List(x,y) => println("列表中只有2个元素,和是："+(x+y))
      case List(x,y,z) => println("列表中只有3个元素,和是："+(x+y))
      case List(x,_*) => println("这是一个列表，包含多个元素，和是："+myList.sum)
    }



  }

}
